package com.xjh.basestudy.javabase.streamandlambda;

import com.xjh.basestudy.javabase.streamandlambda.enity.Mask;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * @author XuJianHua
 * @version 1.0
 * @company 湖南安第斯信息科技有限公司, 版权所有
 * @date 2022/6/25 17:37
 */
public class UnderstandLambda {
    public static void main(String[] args) {
        // 简化步骤：正常调用->函数式->匿名内部类->lambda
        // 1.正常调用（直接调用转换日期的方法）
        ConvertDate.DateFormat(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
        // 2.函数式     类名::类中方法
        FunctionalInterfaceTest<LocalDateTime, String, String> functionDateFormat = ConvertDate::DateFormat;
        String dateString = functionDateFormat.run(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
        // 匿名内部类调用
        String dateString1 = new FunctionalInterfaceTest<LocalDateTime, String, String>() {
            @Override
            public String run(LocalDateTime localDateTime, String s) {
                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(s);
                return localDateTime.format(dateTimeFormatter);
            }
        }.run(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
        // 匿名内部类改为lambda
        FunctionalInterfaceTest<LocalDateTime, String, String> functionDateFormat2 = (LocalDateTime dateTime, String partten) -> {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(partten);
            return dateTime.format(dateTimeFormatter);
        };
        // 报错：Non-static method cannot be referenced from a static context
        // 加上static后接口报错：Static methods in interfaces should have a body
        // KiteFunction<LocalDateTime, String, String> s =  KiteFunction::run;
        String dateString2 = functionDateFormat.run(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
        System.out.println(dateString);

        /**其他理解1*/
        // understand
        // 1.普通实现：需要写实现类，然后new 实现类对象，调用其中方法
        // 2.lambda实现： 实现了接口中的sayMessage方法、并传入了一个message参数（方法无返回值时，不需要加大括号）
        FunctionalInterfaceTest2 functionalInterfaceTest2 = message -> System.out.println("Hello " + message);
        functionalInterfaceTest2.sayMessage("徐建华");
        // 调用lambda的静态方法
        FunctionalInterfaceTest.printHello();

        //报错：你上面这个他会和saymessage的入参和返回值匹配，发现不匹配，所以不行,你把saymessage的入参的string去掉
//        FunctionalInterfaceTest2 functionalInterfaceTest3 = FunctionalInterfaceTest2::printHello;




        /**
         *
         * */
        List<Mask> maskList = new ArrayList<>();
        maskList.add(new Mask("3M", "KN95"));
        maskList.add(new Mask("3M", "FFP2"));
        maskList.add(new Mask("Honeywell", "KN95"));
        maskList.add(new Mask("Honeywell", "N95"));
        // 1.使用匿名函数通过口罩品牌对口罩进行排序
        maskList.sort(new Comparator<Mask>() {
            @Override
            public int compare(Mask o1, Mask o2) {
                return o1.getBrand().compareTo(o2.getBrand());
            }
        });
        // 2.使用lambda（sort中参数是Comparator接口，该接口是一个lambda接口，可以使用lambda表达式）
        maskList.sort((Mask o1, Mask o2) -> o1.getBrand().compareTo(o2.getBrand()));
        // 和2是同样的功能 但是没有省略return
        maskList.sort((Mask o1, Mask o2) -> {
            return o1.getBrand().compareTo(o2.getBrand());
        });



    }


}
